package cn.lg.soar.system.auth.entity;

import cn.lg.soar.common.util.current.IBaseUser;
import cn.lg.soar.common.util.trans.annotations.Translate;
import cn.lg.soar.core.util.easyexcel.translate.TranslateConverter;
import cn.lg.soar.database.base.entity.BaseEntity;
import cn.lg.soar.database.query.annotations.SoarQueryIgnore;
import cn.lg.soar.database.translate.TranslateByEntity;
import cn.lg.soar.system.handler.UserStatusTranslateHandler;
import cn.lg.soar.system.handler.UserTypeTranslateHandler;
import cn.lg.soar.system.tenant.entity.Tenant;
import com.alibaba.excel.annotation.ExcelIgnoreUnannotated;
import com.alibaba.excel.annotation.ExcelProperty;
import com.alibaba.excel.annotation.write.style.ColumnWidth;
import com.baomidou.mybatisplus.annotation.*;
import com.fasterxml.jackson.annotation.JsonIgnore;
import com.fasterxml.jackson.annotation.JsonProperty;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import lombok.experimental.Accessors;

import java.io.Serializable;
import java.time.LocalDateTime;

/**
 * @author luguoxiang
 * 开源项目：https://gitee.com/lgx1992/lg-soar 求star！请给我star！请帮我点个star！
 */
@ExcelIgnoreUnannotated
@Getter
@Setter
@Accessors(chain = true)
@TableName("lg_sys_user")
public class User extends BaseEntity implements IBaseUser {

    private static final long serialVersionUID = -6521092255758816962L;
    @ApiModelProperty(value = "主键id")
    @TableId
    private Long id;

    @ApiModelProperty(value = "用户名（账号）", example = "test-user")
    @ColumnWidth(20)
    @ExcelProperty(value = "用户名（账号）")
    @TableField(updateStrategy = FieldStrategy.NEVER)
    private String username;

    @ApiModelProperty(value = "昵称", example = "测试用户")
    @ColumnWidth(18)
    @ExcelProperty(value = "昵称")
    private String nickname;

    @ApiModelProperty(value = "头像")
    private String avatar;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @ApiModelProperty(value = "登录失败次数")
    private Integer pwdErrorCount;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @ApiModelProperty(value = "最后登录时间")
    @ColumnWidth(18)
    @ExcelProperty(value = "最后登录时间")
    private LocalDateTime lastLoginDate;

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @ApiModelProperty(value = "登录次数(成功)")
    @ColumnWidth(20)
    @ExcelProperty(value = "登录次数(成功)")
    private Integer loginCount;

    @ApiModelProperty(value = "当前所属租户id")
    @TranslateByEntity(Tenant.class)
    private Integer currentTenantId;

    /**
     * 用户类型代表着完全不一样的身份，并不仅仅是权限不同的角色区分，主要是身份信息字段的不同，比如学号班级只有学生有，而企业或平台管理员是没有这些信息的
     * 请根据业务需要配置（比如：0平台管理员、1卖家、2买家 或者 0平台管理员、1学校、2企业、3学生）
     * 不允许通过更新接口修改用户类型
     */
    @Translate(UserTypeTranslateHandler.class)
    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @ApiModelProperty(value = "用户类型（根据系统需要配置）")
    @ColumnWidth(15)
    @ExcelProperty(value = "用户类型", converter = TranslateConverter.class)
    private Integer userType;

    /**
     * 根据业务需要设计状态值（比如：0正常、1未实名、2被禁用  或者 0正常、1待审核、2已冻结、3永久禁用）
     * 不允许通过更新接口修改用户状态
     */
    @Translate(UserStatusTranslateHandler.class)
//    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    @ApiModelProperty(value = "状态（根据系统需要配置）")
    @ColumnWidth(10)
    @ExcelProperty(value = "状态", converter = TranslateConverter.class)
    private Integer status;

    @SoarQueryIgnore
    @JsonIgnore
    private String password;

    /**
     * 密钥（用于密码加密和token加密等）
     */
    @SoarQueryIgnore
    @JsonIgnore
    private String secret;

    @JsonIgnore
    @TableLogic
    @TableField(select = false)
    protected Boolean deleted;

    @Version
    @ApiModelProperty(value = "乐观锁")
    protected Integer version;

    @Override
    public Serializable primaryKey() {
        return this.id;
    }

}
